import { addCache, clearCache, getCache } from './cache';
import config from './config';

// sendBeacon存不存在
export const isSupportSendBeacon = () => {
  return 'sendBeacon' in window.navigator;
};

/**
 * 发送给后端日志数据
 * @param {*} data
 * @returns
 */
export const sendReport = (data) => {
  if (!config.url) {
    console.warn('未配置上报地址');
    return;
  }

  const reportData = JSON.stringify(data);

  // 如果配置了图片上传，直接使用图片上传方式
  if (config.isImgUpload) {
    imgRequest(reportData);
  } else {
    if (isSupportSendBeacon()) {
      beaconRequest(config.url, reportData);
    } else {
      fetchRequest(config.url, reportData);
    }
  }
};

/**
 * 批量上报数据
 * @param {*} data
 */
export const lazyReportBatch = (data) => {
  // 将数据添加到缓存中
  addCache(data);

  // 获取缓存中的数据
  const cache = getCache();

  // 如果缓存中的数据长度大于0且大于配置中的批量大小
  if (cache.length && cache.length >= config.batchSize) {
    // 执行报告函数
    sendReport(cache);
    // 清空缓存
    clearCache();
  }
};

/**
 * 发送图片数据
 * @param {*} data
 */
export const imgRequest = (data) => {
  const img = new Image();
  img.src = `${config.url}?data=${encodeURIComponent(JSON.stringify(data))}`;
};

/**
 * 发送 fetch 数据
 * @param {*} url
 * @param {*} data
 */
export const fetchRequest = (url, data) => {
  if (window.requestIdleCallback) {
    window.requestIdleCallback(
      () => {
        fetch(url, {
          method: 'POST',
          body: data,
          headers: {
            'Content-Type': 'application/json',
          },
        });
      },
      { timeout: 3000 }
    );
  } else {
    setTimeout(() => {
      fetch(url, {
        method: 'POST',
        body: data,
        headers: {
          'Content-Type': 'application/json',
        },
      });
    });
  }
};

/**
 * 发送数据的处理逻辑
 * @param {*} url 上报地址
 * @param {*} data 上报数据
 */
export const beaconRequest = (url, data) => {
  if (window.requestIdleCallback) {
    window.requestIdleCallback(
      () => {
        window.navigator.sendBeacon(url, data);
      },
      { timeout: 3000 }
    );
  } else {
    setTimeout(() => {
      window.navigator.sendBeacon(url, data);
    });
  }
};
